﻿#include "ThreadPool.h"
// 构造函数：启动指定数量的工作线程
ThreadPool::ThreadPool(size_t threads) : stop(false) {
    // 如果传入线程数为0，使用硬件并发数
    if (threads == 0) {
        threads = std::thread::hardware_concurrency(); // 获取CPU核心数
        // 如果无法获取硬件并发数，默认使用2个线程
        if (threads == 0) threads = 2;
    }
    // 创建指定数量的工作线程
    for (size_t i = 0; i < threads; ++i) {
        workers.emplace_back([this] { // lambda 捕获 this 指针
            for (;;) { // 无限循环，工作线程持续运行
                std::function<void()> task; // 定义任务容器
                {
                    // 加锁保护任务队列
                    std::unique_lock<std::mutex> lock(this->queue_mutex);
                    // 等待条件：线程池停止 或 任务队列非空
                    this->condition.wait(lock, [this] {
                        return this->stop || !this->tasks.empty();
                    });
                    // 如果线程池已停止且任务队列为空，退出循环（线程结束）
                    if (this->stop && this->tasks.empty())
                        return;
                    // 从队列取出任务
                    task = std::move(this->tasks.front());
                    this->tasks.pop(); // 弹出队列中的任务
                }
                // 执行任务（队列外执行，避免锁住队列）
                task();
            }
        });
    }
}

// 析构函数：停止所有线程
ThreadPool::~ThreadPool() {
    {
        // 加锁修改 stop 标志，通知线程池停止
        std::unique_lock<std::mutex> lock(queue_mutex);
        stop = true;
    }
    // 唤醒所有等待线程，让它们检测 stop 标志退出
    condition.notify_all();
    // 等待所有线程完成（阻塞直到 join 完成）
    for (std::thread& worker : workers) {
        if (worker.joinable()) // 判断线程是否可 join
            worker.join();      // 等待线程结束
    }
}